// 有序数组拼接

// #include <stdio.h>
// int main()
// {
//     int arr2[7] = {1, 2, 2, 5, 7, 8, 10};
//     int arr1[7] = {2, 3, 3, 4, 7, 12, 12};
//     int arr3[15] = {0};
//     int i = 0;
//     int j = 0;
//     int k = 0;
//     int N = 7;
//     while(i<N || j<N)
//     {
//         if(i>=N)
//         {
//             arr3[k] = arr2[j];
//             j++;
//         }
//         else if(j>=N || arr1[i]<arr2[j])
//         {
//             arr3[k] = arr1[i];
//             i++;
//         }
//         else
//         {
//             arr3[k] = arr2[j];
//             j++;
//         }
//         k++;
//     }
//     for(i = 0;i < k;i++)
//     {
//         printf("%d ",arr3[i]);
//     }
//     return 0;
// }

// 郝斌同步实现

// 函数声明

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef struct
{
    int *pBase;
    int len;
    int cnt;
} Arr;

bool is_empty(const Arr *pArr);
bool is_full(const Arr *pArr);
void show_arr(const Arr *pArr);
void init_arr(Arr *pArr, int lenth);
void append_arr(Arr *pArr, int val);
void insert_arr(Arr *pArr, int pos, int val);   // pos从1开始，表示插入后该元素为第几个元素
bool delete_arr(Arr *pArr, int pos, int *pVal); // pos从1开始，表示插入后该元素为第几个元素
void inversion_arr(Arr *pArr);
void sort_arr(Arr *pArr); // 从小到大排序

int main()
{
    Arr arr;
    int val = 0;
    int lenth = 7;
    init_arr(&arr, lenth);
    show_arr(&arr);
    append_arr(&arr, 1);
    append_arr(&arr, 2);
    append_arr(&arr, 6);
    append_arr(&arr, 4);
    append_arr(&arr, 5);
    append_arr(&arr, 3);
    insert_arr(&arr, 7, 10);

    // show_arr(&arr);
    // inversion_arr(&arr);
    // show_arr(&arr);
    // sort_arr(&arr);
    // show_arr(&arr);
    // inversion_arr(&arr);

    /*
    if(delete_arr(&arr, 1, &val))
        printf("被删除内容:%d\n", val);
    */
    // append_arr(&arr, 7);
    show_arr(&arr);

    free(arr.pBase);
    arr.pBase = NULL;
    return 0;
}

bool is_empty(const Arr *pArr)
{
    assert(pArr);
    if (pArr->cnt == -1)
        return true;
    else
        return false;
}

bool is_full(const Arr *pArr)
{
    assert(pArr);
    if (pArr->cnt == pArr->len - 1)
        return true;
    else
        return false;
}

void show_arr(const Arr *pArr)
{
    assert(pArr);
    if (is_empty(pArr))
        printf("数组内容为空!\n");
    else
    {
        int i = 0;
        printf("数组内容为:");
        for (i = 0; i <= pArr->cnt; i++)
        {
            printf("%d ", pArr->pBase[i]);
        }
        printf("\n");
        return;
    }
}

void init_arr(Arr *pArr, int lenth)
{
    assert(pArr);
    pArr->pBase = (int *)malloc(sizeof(int) * lenth);
    if (NULL == pArr->pBase)
    {
        printf("结构体数组创建失败！\n");
        exit(-1);
    }
    else
    {
        pArr->len = lenth;
        pArr->cnt = -1;
    }
    printf("结构体数组初始化成功\n");
    return;
}

void append_arr(Arr *pArr, int val)
{
    assert(pArr);
    if (is_full(pArr))
    {
        printf("数组已满，元素%d追加失败!\n", val);
        return;
    }
    pArr->pBase[++(pArr->cnt)] = val;
    // printf("追加成功\n");
    return;
}

void insert_arr(Arr *pArr, int pos, int val) // pos从1开始，表示插入后该元素为第几个元素
{
    assert(pArr);
    if (pos < 1 || pos > pArr->len + 1)
    {
        printf("插入失败,pos值非法!(pos应从1开始,且不大于数组长度+1)\n");
        return;
    }
    if (is_full(pArr))
    {
        printf("插入失败，数组已满！\n");
        return;
    }
    if (pos > pArr->cnt + 2)
    {
        printf("插入失败，该位置前还有 %d个空余空间,请使用追加函数或修改pos值!\n", pos - pArr->cnt - 2);
        return;
    }
    int i = 0;
    for (i = pArr->cnt; i >= pos - 1; i--)
    {
        pArr->pBase[i + 1] = pArr->pBase[i];
    }
    pArr->pBase[pos - 1] = val;
    pArr->cnt++;
    printf("插入成功！\n");
    return;
}

// 删除成功返回true,删除失败返回false
bool delete_arr(Arr *pArr, int pos, int *pVal) // pos从1开始，表示插入后该元素为第几个元素
{
    assert(pArr);
    if (is_empty(pArr))
    {
        printf("删除失败，数组为空！\n");
        return false;
    }
    if (pos < 1 || pos > pArr->cnt + 1)
    {
        printf("删除失败,pos值非法!(pos值应从1开始,且不大于数组当前元素个数)\n");
        return false;
    }

    *pVal = pArr->pBase[pos - 1];
    int i = 0;
    for (i = pos - 1; i < pArr->cnt; i++)
    {
        pArr->pBase[i] = pArr->pBase[i + 1];
    }
    pArr->cnt--;
    printf("删除成功！\n");
    return true;
}

void inversion_arr(Arr *pArr)
{
    assert(pArr);
    int i = 0;
    int j = pArr->cnt;
    while (i < j)
    {
        int temp = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = temp;
        i++;
        j--;
    }
    printf("倒置成功！\n");
    return;
}

void sort_arr(Arr *pArr) // 从小到大排序
{
    assert(pArr);
    int i = 0;
    int j = 0;
    for (i = 0; i < pArr->cnt; i++)
    {
        for (j = i + 1; j <= pArr->cnt; j++)
        {
            if (pArr->pBase[i] > pArr->pBase[j])
            {
                int temp = pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[j];
                pArr->pBase[j] = temp;
            }
        }
    }
    printf("排序成功！\n");
    return;
}
